package com.snmp.test.snmp;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;

import java.io.IOException;
import java.util.HashMap;
import java.util.Vector;

/**
 * @author guojing
 * @version 1.0.0
 * @ClassName SnmpSendUtils.java
 * @Description 向 snmp-agent 发送 get 请求
 * @createTime 2023年07月02日 22:32:00
 */
public class SnmpSendUtils {

    private Snmp snmp = null;// 该类是SNMP4J中最为核心的类。负责SNMP报文的接受和发送。
    private Address targetAddress = null;


    // 初始化
    public void initComm(String ip, String port) throws IOException {
        // 设置Agent方的IP和端口
        String snmpAddr = "udp:"+ ip + "/" + port;
        targetAddress = GenericAddress.parse(snmpAddr);
        // 一般情况下，我们都使用UDP协议作为SNMP的传输层协议，所以我们需要实例化的是一个DefaultUdpTransportMapping接口对象；
        TransportMapping<UdpAddress> transport = new DefaultUdpTransportMapping();
        // 将DefaultUdpTransportMapping接口作为参数传入Snmp构造器，实例化Snmp对象。
        snmp = new Snmp(transport);
        // 监听snmp信息
        transport.listen();
    }

    @SuppressWarnings("unchecked")
    public HashMap<String, Object>  sendPDU(String community, String oid) throws IOException {
        // 设置 target
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString(community));
        target.setAddress(targetAddress);
        // 通信不成功时的重试次数
        target.setRetries(2);
        // 超时时间
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version1);
        // 创建 PDU
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(new OID(oid)));
        // MIB的访问方式
        pdu.setType(PDU.GET);
        // 向Agent发送PDU，并接收Response
        ResponseEvent respEvnt = snmp.send(pdu, target);
        // 解析Response
        HashMap<String, Object> eventMap = new HashMap<>();
        if (respEvnt != null && respEvnt.getResponse() != null) {
            Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getResponse().getVariableBindings();
            for (int i = 0; i < recVBs.size(); i++) {
                VariableBinding recVB = recVBs.elementAt(i);
                System.out.println(recVB.getOid() + " : " + recVB.getVariable());
                eventMap.put(recVB.getOid().toString(), recVB.getVariable());
            }
        }
        return eventMap;
    }

    public static void main(String[] args) {
        try {
            System.out.println("start");
            SnmpSendUtils util = new SnmpSendUtils();
            util.initComm("192.168.2.1", "161");
            util.sendPDU("public", ".1.3.6.1.2.1.1.3.0");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

